#!/usr/bin/env python
"""
维修管理系统大规模测试数据初始化脚本
用于创建大量测试用户和设备数据
"""

import os
import sys
import django
from django.contrib.auth.hashers import make_password

# 设置Django环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'maintenance_system.settings')
django.setup()

from django.contrib.auth.models import User
from users.models import Profile
from assets.models import Asset
import random
from datetime import datetime, timedelta

def create_users():
    """创建测试用户"""
    print("开始创建用户数据...")
    
    # 用户配置
    user_configs = {
        'admin': [
            {'username': 'admin1', 'email': 'admin1@example.com', 'first_name': '张', 'last_name': '管理员'}
        ],
        'technician': [
            {'username': 'tech1', 'email': 'tech1@example.com', 'first_name': '王', 'last_name': '技术'},
            {'username': 'tech2', 'email': 'tech2@example.com', 'first_name': '李', 'last_name': '工程师'},
            {'username': 'tech3', 'email': 'tech3@example.com', 'first_name': '陈', 'last_name': '维修师'}
        ],
        'customer': [
            {'username': 'customer1', 'email': 'customer1@example.com', 'first_name': '刘', 'last_name': '客户'},
            {'username': 'customer2', 'email': 'customer2@example.com', 'first_name': '孙', 'last_name': '用户'},
            {'username': 'customer3', 'email': 'customer3@example.com', 'first_name': '周', 'last_name': '测试'}
        ],
        'receptionist': [
            {'username': 'reception1', 'email': 'reception1@example.com', 'first_name': '吴', 'last_name': '前台'},
            {'username': 'reception2', 'email': 'reception2@example.com', 'first_name': '郑', 'last_name': '接待'},
            {'username': 'reception3', 'email': 'reception3@example.com', 'first_name': '王', 'last_name': '服务'}
        ],
        'quality_checker': [
            {'username': 'quality1', 'email': 'quality1@example.com', 'first_name': '赵', 'last_name': '质检'},
            {'username': 'quality2', 'email': 'quality2@example.com', 'first_name': '钱', 'last_name': '检查'},
            {'username': 'quality3', 'email': 'quality3@example.com', 'first_name': '孙', 'last_name': '审核'}
        ]
    }
    
    created_users = []
    
    # 创建各角色用户
    for role, users_data in user_configs.items():
        for user_data in users_data:
            is_staff = (role == 'admin')
            is_superuser = (role == 'admin')
            
            user, created = User.objects.get_or_create(
                username=user_data['username'],
                defaults={
                    'email': user_data['email'],
                    'first_name': user_data['first_name'],
                    'last_name': user_data['last_name'],
                    'is_staff': is_staff,
                    'is_superuser': is_superuser,
                    'password': make_password('password123')
                }
            )
            
            if created:
                # 新创建用户，先删除可能由信号自动创建的Profile，然后重新创建正确的Profile
                Profile.objects.filter(user=user).delete()
                Profile.objects.create(
                    user=user,
                    role=role,
                    phone=f'1{random.randint(30,39)}{random.randint(1000,9999)}{random.randint(1000,9999)}'
                )
                created_users.append(user)
                print(f"创建{role}用户: {user.username}")
            else:
                # 更新现有用户 - 先删除可能存在的默认Profile，然后重新创建
                Profile.objects.filter(user=user).delete()
                Profile.objects.create(
                    user=user,
                    role=role,
                    phone=f'1{random.randint(30,39)}{random.randint(1000,9999)}{random.randint(1000,9999)}'
                )
                user.set_password('password123')
                user.save()
                created_users.append(user)
                print(f"更新{role}用户: {user.username}")
    
    return created_users

def create_assets(users):
    """创建设备数据 - 只为客户用户创建"""
    print("\n开始创建设备数据...")
    
    # 设备类型定义
    device_types = {
        'COM': ['台式电脑', '笔记本电脑', '服务器', '工作站', '一体机'],
        'PRN': ['激光打印机', '喷墨打印机', '多功能一体机', '针式打印机', '标签打印机'],
        'MON': ['液晶显示器', 'LED显示器', '曲面显示器', '4K显示器', '便携显示器'],
        'NET': ['路由器', '交换机', '无线AP', '网络存储', '防火墙'],
        'SCN': ['平板扫描仪', '高速扫描仪', '文档扫描仪', '胶片扫描仪', '便携扫描仪'],
        'PHN': ['智能手机', '平板电脑', '对讲机', 'IP电话', '会议电话'],
        'PRJ': ['投影仪', '电子白板', '视频会议设备', '音响系统', '显示大屏'],
        'UPS': ['不间断电源', '稳压器', '电源管理器', '电池备份', '电源分配器'],
        'OTH': ['键盘', '鼠标', '摄像头', '耳机', '移动硬盘']
    }
    
    created_assets = []
    # 只获取角色为'customer'的用户
    customer_users = [user for user in users if hasattr(user, 'profile') and user.profile.role == 'customer']
    
    if not customer_users:
        print("没有找到客户用户，无法分配设备")
        return []
    
    print(f"找到 {len(customer_users)} 个客户用户，将为每个用户创建100个设备")
    
    # 只为客户用户创建设备
    for customer in customer_users:
        print(f"\n为客户用户 {customer.username} 创建设备:")
        
        for i in range(1, 101):  # 创建100个设备
            # 随机选择设备类型
            dept_code = random.choice(list(device_types.keys()))
            device_name = random.choice(device_types[dept_code])
            
            # 生成唯一的设备代码
            asset_code = f"{dept_code}-{customer.username.upper()}-{i:04d}"
            
            if not Asset.objects.filter(code=asset_code).exists():
                # 映射设备类型
                type_mapping = {
                    'COM': 'computer',
                    'PRN': 'printer', 
                    'MON': 'monitor',
                    'NET': 'network',
                    'SCN': 'scanner',
                    'PHN': 'phone',
                    'PRJ': 'projector',
                    'UPS': 'ups',
                    'OTH': 'other'
                }
                
                from django.utils import timezone
                asset = Asset.objects.create(
                    code=asset_code,
                    name=f"{device_name} #{i:03d}",
                    model=f"{device_name}型号-{random.randint(1000, 9999)}",
                    asset_type=type_mapping.get(dept_code, 'other'),
                    assigned_to=customer,
                    status=random.choice(['active', 'maintenance', 'retired']),
                    purchase_date=timezone.now() - timedelta(days=random.randint(30, 1095)),  # 30天到3年
                    purchase_price=random.randint(500, 20000),
                    department=random.choice(['IT', '财务', '行政', '销售', '研发']),
                    serial_number=f"SN-{dept_code}-{random.randint(100000, 999999)}",
                    location=random.choice(['总部', '分公司A', '分公司B', '远程办公', '仓库'])
                )
                created_assets.append(asset)
                
                # 每创建10个设备显示一次进度
                if i % 10 == 0:
                    print(f"  已创建 {i}/100 个设备")
    
    return created_assets

def main():
    """主函数"""
    print("=" * 60)
    print("维修管理系统大规模测试数据初始化脚本")
    print("=" * 60)
    
    try:
        # 创建用户
        users = create_users()
        
        # 创建设备（只为客户用户）
        assets = create_assets(users)
        
        print("\n" + "=" * 60)
        print("数据初始化完成！")
        print(f"创建用户总数: {len(users)} 个")
        print(f"创建设备总数: {len(assets)} 台")
        print(f"客户用户数量: {len([u for u in users if hasattr(u, 'profile') and u.profile.role == 'customer'])} 个")
        print("\n默认密码: password123")
        print("=" * 60)
        
    except Exception as e:
        print(f"初始化过程中出现错误: {e}")
        import traceback
        traceback.print_exc()

if __name__ == "__main__":
    main()
